graficación en gglot y plotly-oscar

introducción

este documento contiene visualización de datos elaborados con ggplot2 y plotly

#carga de paquetes

library(tidyverse)
library(plotly)
library(DT)
library(gapminder)
library(ggthemes)
library(hrbrthemes)
library(palmerpenguins)

carga de datos

mpg

Código
 mpg |>
  datatable(
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

diamonds

Código
diamonds |>
  datatable(
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

gapminder

Código
#carga de datos de gapminder 
gapminder |>
  filter(year == 2007 ) |> 
  datatable(
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

covid

Código
# Carga del archivo CSV de entrada en un dataframe
# con la función read_delim() de readr
covid_general <-
  read_delim(
    file = "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2023-i/main/datos/ministerio-salud/covid/05_30_22_CSV_GENERAL.csv",
    col_select = c(
      "FECHA",
      "positivos",
      "activos",
      "RECUPERADOS",
      "fallecidos",
      "nue_posi",
      "nue_falleci",
      "salon",
      "UCI"
    )
  )


# Cambio de nombre de columnas
covid_general <-
  covid_general |>
  rename(
    fecha = FECHA,
    recuperados = RECUPERADOS,
    nuevos_positivos = nue_posi,
    nuevos_fallecidos = nue_falleci,
    uci = UCI
  )

# Cambio de tipo de datos de la columna fecha, de str a date
covid_general <-
  covid_general |>
  mutate(fecha = as.Date(fecha, format = "%d/%m/%Y"))

#carga de datos de covid
covid_general |>
  datatable(
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

delitos

Código
# Carga de datos
delitos_2022 <-
  read_delim(
    file = "https://raw.githubusercontent.com/gf0604-procesamientodatosgeograficos/2023-i/main/datos/oij/estadisticas-policiales/estadisticaspoliciales2022.csv"
  )

# Tabla de datos
delitos_2022 |>
  datatable(
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )

conceptos basicos de graficación

Código
# forma básica 
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy))

Código
# forma con pipes
mpg |> 
  ggplot(aes(x = displ, y = hwy)) + 
  geom_point()

Código
# variables adicionales - color 
mpg |> 
  ggplot(aes(x = displ, y = hwy, color = class)) + 
  geom_point()

Código
# variables adicionales - color 
mpg |> 
  ggplot(aes(x = displ, y = hwy, shape = class)) + 
  geom_point()

Código
# Gráfico de dispersión de cilindrada vs millas por galón en autopista
# con formas y colores correspondientes al tipo de automóvil
mpg |>
  ggplot(aes(x = displ, y = hwy, shape = class, color = class)) +
  geom_point() +
  scale_shape_manual(values = c(0, 1, 2, 3, 4, 5, 6)) +
  scale_color_manual(values = c("red", "blue", "green", "purple", "orange", "brown", "pink"))

Código
# Gráfico de dispersión de rendimiento en autopista vs rendimiento en ciudad
# con tamaño de puntos correspondiente a la cilindrada
mpg |>
  ggplot(aes(x = hwy, y = cty, size = displ)) +
  geom_point()

Código
# Gráfico de dispersión de cilindrada vs millas por galón en autopista
# + curva de tendencia
mpg |>
  ggplot(aes(x = displ, y = hwy)) +
  geom_point() +
  geom_smooth()

Código
# Gráfico de dispersión de cilindrada vs millas por galón en autopista
# coloreado por tipo de tracción
# + curva de tendencia
mpg |>
  ggplot(aes(x = displ, y = hwy, color = drv)) +
  geom_point() +
  geom_smooth()

Código
# grafico de disperción de cilindos vs rendimiento en ciudad 
# y que muestre la variable de tipo de conbustible (fl)


mpg |> 
  ggplot(aes(x = cyl, y = cty, color = fl)) + 
  geom_point()

paneles

# Gráfico de dispersión de cilindrada vs millas por galón en autopista
# + paneles por tipo de automóvil
mpg |>
  ggplot(aes(x = displ, y = hwy)) +
  geom_point() +
  facet_wrap(~ class, nrow = 2)

# Gráfico de dispersión de cilindrada vs millas por galón en autopista
# + paneles por tipo de automóvil y tipo de tracción
mpg |>
  ggplot(aes(x = displ, y = hwy)) +
  geom_point() +
  facet_grid(class ~ drv)

estilos

# Gráfico de dispersión de cilindrada vs millas por galón en autopista
# coloreado por tipo de tracción con título, subtítulo y etiquetas
mpg |>
  ggplot(aes(x = displ, y = hwy, color = drv)) +
  geom_point() +
  geom_smooth() +
  ggtitle("Cilindrada vs rendimiento en autopista por tipo de tracción") +
  xlab("Cilindrada (l)") +
  ylab("Rendimiento en autopista (mpg)") +
  labs(subtitle = "Datos de 38 modelos de automóviles de años entre 1999 y 2008", 
       caption = "Fuente: United States Environmental Protection Agency (EPA)",
       color = "Tipo de tracción")
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'

conceptos básicos de graficicón

todo gráfico en ggplot2 tiene 3 componentes 1. datos ( dataframe) 2.un mapeo (asociacón) de la variables del conjunto de datos con las propiedades visuales del gráfico: eje x, eje y, tamaño, forma, color, etc. (función aes()). 3. una o varias capas de greometrías: puntos, baras, cajas, histogramas, etc. (geom_point (), geom_box, geom_smoot()).

mpg |> 
  ggplot(aes(x = displ, y = hwy))+
geom_point()

# variables de color 
mpg |> 
  ggplot(aes(x = displ, y = hwy, color = cyl ))+
geom_point()

# variable forma 
mpg |> 
  ggplot(aes(x = displ, y = hwy, shape =class))+
geom_point()
Warning: The shape palette can deal with a maximum of 6 discrete values because
more than 6 becomes difficult to discriminate; you have 7. Consider
specifying shapes manually if you must have them.
Warning: Removed 62 rows containing missing values (`geom_point()`).

capas adicionales

mpg |> 
  ggplot(aes(x = displ, y = hwy))+
geom_point() + 
  geom_smooth(method = "lm")
`geom_smooth()` using formula = 'y ~ x'

estilos

mpg |> 
  ggplot(aes(x = displ, y = hwy, color = drv))+
geom_point() + 
  geom_smooth()+
  ggtitle("cilindrada vs rendimiento en autopista") +
  xlab("cilindrada (l)")+
  ylab("rendimiento en autopista (mpg)")+
  labs(subtitle = "datos de 38 modelos de automoviles",
       caption = "fuente: EPA",
       color = "tipo de tracción")+
  theme_excel_new()

# hay mas estilos en la sección 11.5.1.6.2 de la pagina web 

Gráfico de dispersión de peso vs precio de diamantes

coloreado por claridad

diamonds |>
  ggplot(aes(x = carat, y = price, color = clarity)) +
  geom_point() +
  ggtitle("Peso vs precio de diamantes") +
  xlab("Peso (quilates)") +
  ylab("Precio ($ EE.UU.)") +
  labs(color = "Claridad\n(I1=peor IF=mejor)") +
   scale_colour_brewer(palette = "Blues", direction = -1)

plotly

grafico_ggplot2 <-
mpg |> 
  ggplot(aes(x = displ, y = hwy, color = drv))+
geom_point(
  aes(
    text = paste0("fabricante: ", manufacturer, " ", model," ", year, "\n",
      "cilindrada: ", displ, "l", "\n",
      "rendimiento en autopista: ", hwy, "mpg", "\n",
      "tipo de tracción: ", drv)
  )
) 
Warning in geom_point(aes(text = paste0("fabricante: ", manufacturer, " ", :
Ignoring unknown aesthetics: text
ggplotly(grafico_ggplot2, tooltip = "text") |>
  config(locale = "es")

#tipos de gráficos

histogramas

histograma_ggplot2 <-
gapminder|>
  filter(year == 2007) |> 
  ggplot(aes(x= gdpPercap)) +
  geom_histogram(
    aes(
      text = paste0(
        "PIB per cápita (valor medio del rango): $", round(after_stat(x), 2), "\n",
        "Frecuencia: ", after_stat(count)
      ),
    y = after_stat(density)
      ),
    bins = 10
  ) +
  geom_density() +
  ggtitle("Distribución del PIB per cápita en 2007") +
  xlab("PIB per cápita ($ EE.UU.)") +
  ylab("Frecuencia") +
  labs(subtitle = "Datos de 14o países", caption = "Fuente: Gapminder.org") +
  theme_economist()

ggplotly(histograma_ggplot2)
ggplotly(histograma_ggplot2, tooltip = "text") |> 
  config(locale = 'es')

Histogramas ggplot2 de distribución del PIB per cápita en 2007 por continente

histograma_ggplot2 <-
  gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = gdpPercap, fill = continent)) +
  geom_histogram(
    aes(
      text = paste0(
        "Continente: ", after_stat(fill), "\n",
        "PIB per cápita (valor medio del rango): $", round(after_stat(x), 2), "\n",
        "Frecuencia: ", after_stat(count)
      ),      
      y = after_stat(density)
    ),    
    bins = 10
  ) +
  ggtitle("Distribución del PIB per cápita en 2007 por continente") +
  xlab("PIB per cápita ($ EE.UU.)") +
  ylab("Densidad") +
  labs(subtitle = "Datos de 140 países",
       caption = "Fuente: Gapminder.org",
       fill = "Continente") +
  theme_economist()

ggplotly(histograma_ggplot2, tooltip = "text") |>
  config(locale = 'es')

gráficos de caja

Código
# Gráfico de caja ggplot2 de distribución del PIB per cápita en 2007
grafico_caja_ggplot2 <-
gapminder |>
  filter(year == 2007) |>
  ggplot(aes(y = gdpPercap)) +
  geom_boxplot() +
  ggtitle("Distribución del PIB per cápita en 2007") +
  ylab("PIB per cápita ($ EE.UU.)") +
  labs(subtitle = "Datos de 140 países", caption = "Fuente: Gapminder.org") +
  theme_economist()

# Gráfico de caja plotly
ggplotly(grafico_caja_ggplot2) |> 
  config(locale = 'es')
Código
# Gráfico de caja ggplot2 de distribución del PIB per cápita en 2007 por continente
grafico_caja_ggplot2 <-
gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = continent, y = gdpPercap)) +
  geom_boxplot() +
  ggtitle("Distribución del PIB per cápita en 2007 por continente") +
  ylab("PIB per cápita ($ EE.UU.)") +
  labs(subtitle = "Datos de 140 países", caption = "Fuente: Gapminder.org") +
  theme_economist()

# Gráfico de caja plotly
ggplotly(grafico_caja_ggplot2) |> 
  config(locale = 'es')

gráficos de barras

grafico_barras_ggplot2 <-
gapminder |>
  filter(year == 2007) |>
  ggplot(aes(x = fct_infreq(continent))) +
  geom_bar(
    aes(
      text = paste0(
        "Cantidad de países: ", after_stat(count)
      )
    ),    
  ) +
  ggtitle("Cantidad de países por continente") +
  xlab("Continente") +
  ylab("Cantidad de países") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_bar(aes(text = paste0("Cantidad de países: ",
after_stat(count))), : Ignoring unknown aesthetics: text
ggplotly(grafico_barras_ggplot2, tooltip = "text") |> 
  config(locale = 'es')

elabore un gráfico de barras que muestre la cantidad en cada isla del

archipielago palmer

  penguins |> 
  ggplot(aes(island)) +
  geom_bar()

elabore un gráfico de barras que muestre la cantidad de carros por

tipo de trasmisción en el conjunto de datos mpg

mpg |> 
  ggplot(aes(x = fct_infreq(trans))) +
  geom_bar(aes(text = paste0("transmición: ", after_stat(count))))
Warning in geom_bar(aes(text = paste0("transmición: ", after_stat(count)))):
Ignoring unknown aesthetics: text

proemdio esperanza de vida en 2007

gapminder|>
  filter(year == 2007) |> 
  ggplot(aes(x = continent, y = lifeExp)) +
  geom_bar(
    stat = "summary" ,
    fun.y = "mean"
  )
Warning in geom_bar(stat = "summary", fun.y = "mean"): Ignoring unknown
parameters: `fun.y`
No summary function supplied, defaulting to `mean_se()`

promedio esperanza de vidad 2007 en dplyr

gapminder_mean_lifeexp_continent <-
  gapminder |> 
  filter (year == 2007) |> 
  group_by(continent) |> 
  summarize(lifeExp_mean = mean(lifeExp)) |> 
  arrange(desc(lifeExp_mean))

barras sin transformaciones estadísticas

población de países de América en el año 2007

gapminder |>
  filter(year == 2007 & continent == "Americas") |>
  ggplot(aes(x = reorder(country, pop), y = pop/1000000)) +
  geom_col(
    aes(
      text = paste0(
        "País: ", country, "\n",
        "Población (millones de habitantes): ", round(pop/1000000, 2)
      )
    )
  ) +
  coord_flip() + # para mostrar barras horizontales
  ggtitle("Población de países de América en 2007") +
  xlab("País") +
  ylab("Población (millones de habitantes)") +
  labs(caption = "Fuente: Gapminder.org") +
  theme_economist()
Warning in geom_col(aes(text = paste0("País: ", country, "\n", "Población
(millones de habitantes): ", : Ignoring unknown aesthetics: text

diamonds |>
  ggplot(aes(x = cut, fill = clarity)) +
  geom_bar()

elabore un gráfico de barras apildas que muestre la cantidad de pinguinos en cada isla (una barra por isla ) y que en cada barra esté dividida por el sexo

penguins |>
  ggplot(aes(x = island, fill = sex)) +
  geom_bar()

barras agrupadas

grafico_barras_ggplot2 <-
diamonds |>
  ggplot(aes(x = cut, fill = clarity)) +
  geom_bar(position = "dodge") +
  ggtitle("Cantidad de diamantes por corte y claridad") +
  xlab("Corte") +
  ylab("Cantidad de diamantes") +
  labs(fill = "Claridad") +
  theme_minimal()

# Gráfico de barras plotly
ggplotly(grafico_barras_ggplot2) |> 
  config(locale = 'es')

gráficos de dispersión

PIB per cápita vs esperanza de vida en 2007

gapminder |>
  filter(year == 2007) |> 
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) + 
geom_point()

gráficos de líneas

# Gráfico de líneas con la evolución de los casos de COVID
grafico_lineas_ggplot2 <-
  covid_general |>
  ggplot(aes(x = fecha, y = value, color = variable)) +
  geom_line(aes(y = positivos, color = "Positivos")) +
  geom_line(aes(y = recuperados, color = "Recuperados")) +
  geom_line(aes(y = activos, color = "Activos")) +
  geom_line(aes(y = fallecidos, color = "Fallecidos")) +
  scale_color_manual( # colores
    "",
    values = c(
      "Positivos" = "blue",
      "Recuperados" = "green",
      "Activos" = "red",
      "Fallecidos" = "black"
    )
  ) +
  ggtitle("Casos acumulados de COVID en Costa Rica al 2022-05-30") +
  xlab("Fecha") +
  ylab("Casos") +
  theme_economist()  

# Gráfico de dispersión plotly
ggplotly(grafico_lineas_ggplot2) |>
  config(locale = 'es')

muestre en un gráfico de lineas la cantidad de casos en salón y en uci atravez del tiempo

grafico_lineas_hospitalizados <-
  covid_general |>
  ggplot(aes(x = fecha, y = value, color = variable)) +
  geom_line(aes(y = salon, color = "salon")) +
  geom_line(aes(y = uci, color = "uci")) +
  scale_color_manual( # colores
    "",
    values = c(
      "salon" = "blue",
      "uci" = "green"
    )
  ) +
   ggtitle("Casos acumulados de COVID en Costa Rica al 2022-05-30") +
  xlab("Fecha") +
  ylab("Casos hospitalizados") +
  theme_economist()  

ggplotly(grafico_lineas_hospitalizados) |>
  config(locale = 'es')

gra´ficos de pastel

# crear tabla de frecuencias 
tabla_frecuencias <- table(delitos_2022$Provincia)

# Convertir la tabla en un data frame
delitos_2022_provincias <- as.data.frame(tabla_frecuencias)


# Cambiar nombres de columnas del data frame
delitos_2022_provincias <-
  delitos_2022_provincias |>
  rename(Provincia = Var1, Frecuencia = Freq)

# Calcular porcentajes por provincia
delitos_2022_provincias$Porcentaje <-
  100 * delitos_2022_provincias$Frecuencia / sum(delitos_2022_provincias$Frecuencia)

# Crear gráfico de pastel utilizando ggplot2
grafico_pastel_ggplot2 <-
  delitos_2022_provincias |>
  ggplot(aes(x = "", y = Porcentaje, fill = Provincia)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  theme_void() +
  labs(title = "Porcentaje de delitos cometidos en 2022 por provincia",
    subtitle = "Fuente: OIJ") +
  scale_fill_discrete(name = "Provincia") +
  geom_text(
    aes(label = paste0(round(Porcentaje, 1), "%")),
    position = position_stack(vjust = 0.5),
    color = "white",
    size = 3
  ) 

# Despliegue del gráfico
grafico_pastel_ggplot2